{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "13b01c97",
   "metadata": {
    "papermill": {
     "duration": 0.004204,
     "end_time": "2022-08-26T08:17:40.548013",
     "exception": false,
     "start_time": "2022-08-26T08:17:40.543809",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "和回归问题类似，分类问题不同的地方是预测的值仅限于少量的几个离散的值。我们首先关注二值分类问题，这时预测的值仅限于0和1。比如，我们可以建立一个垃圾邮件分类器，此时$x^{(i)}$是一封邮件的某些特征，y为1表示其为垃圾邮件，否则表示不是垃圾邮件。0也被称为负类，1称为正类。$y^{(i)}$ 也被称为样本i的标记（label）。\n",
    "\n",
    "## Logistic函数\n",
    "如果我们忽略二分类问题中y的取值是一个离散的取值（0或1），我们继续使用线性回归来预测y的取值。这样做会导致y的取值并不为0或1。逻辑回归使用一个函数来归一化y值，使y的取值在区间(0,1)内，\n",
    "\n",
    "$$\n",
    "h(\\theta)=g(\\theta^Tx)=\\frac{1}{1+e^{-\\theta x}}\n",
    "$$\n",
    "这个函数称为Logistic函数(logistic function)，也称为Sigmoid函数(sigmoid function)。函数公式如下：\n",
    "$$\n",
    "g(z) = \\frac{1}{1+e^{-z}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "894b744e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-08-26T08:17:40.558074Z",
     "iopub.status.busy": "2022-08-26T08:17:40.556730Z",
     "iopub.status.idle": "2022-08-26T08:17:40.826199Z",
     "shell.execute_reply": "2022-08-26T08:17:40.824880Z"
    },
    "papermill": {
     "duration": 0.278738,
     "end_time": "2022-08-26T08:17:40.830199",
     "exception": false,
     "start_time": "2022-08-26T08:17:40.551461",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from pylab import *\n",
    "import random\n",
    "import matplotlib  as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    " \n",
    "#myfont = matplotlib.font_manager.FontProperties(fname=r\"simkai.ttf\")  #fname指定字体文件  选简体显示中文\n",
    "#第七行的作用是为了消除更换为unicode字体之后0、负数之类的显示异常。之后所有使用中文字体的地方只字符串都以u\"\"的形式出现，并指定fontproperties属性为我们的指定的myfont就行了\n",
    "mpl.rcParams['axes.unicode_minus'] = False\n",
    "'''\n",
    "mpl.rcParams['font.sans-serif'] = ['SimHei']\n",
    "np.arange([start, ]stop, [step, ]dtype=None) 生成ndarray类型数组\n",
    "start:起始值(默认为 0), 终止值不包含，半开半闭区间\n",
    "step为步长\n",
    "'''\n",
    "t = np.arange(-5, 5, 0.001)\n",
    "\n",
    "# np的ndarray支持向量化计算\n",
    "y = 1/(1 + np.power(e, -t))\n",
    "\n",
    "# plot 通常指的是 折线图（line plot），还可以定义折线的类型，如： plt.plot(x, y, 'ro--')  # 红色圆点 + 虚线\n",
    "plt.plot(t, y)\n",
    "plt.title('sigmoid function')\n",
    "plt.xlabel(u'z')\n",
    "plt.ylabel(u'g(z)')\n",
    " \n",
    "plt.show()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "55be490e",
   "metadata": {
    "papermill": {
     "duration": 0.002808,
     "end_time": "2022-08-26T08:17:40.836431",
     "exception": false,
     "start_time": "2022-08-26T08:17:40.833623",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "Notice that g(z) tends towards 1 as z → ∞, and g(z) tends towards 0 as\n",
    "z → −∞. Moreover, g(z), and hence also h(x), is always bounded between\n",
    "0 and 1. As before, we are keeping the convention of letting x0 = 1, so that\n",
    "\n",
    "$\\theta^Tx=\\theta _0 +\\sum_{j=1}^d θ_jx_j$\n",
    "\n",
    "For now, let’s take the choice of g as given. Other functions that smoothly\n",
    "increase from 0 to 1 can also be used, but for a couple of reasons that we’ll see\n",
    "later (when we talk about GLMs, and when we talk about generative learning\n",
    "algorithms), the choice of the logistic function is a fairly natural one. Before\n",
    "moving on, here’s a useful property of the derivative of the sigmoid function,\n",
    "which we write as g′:\n",
    "\n",
    "$g'(z)=\\frac{d}{dz}(\\frac{1}{1+e^{-z}})= \\frac{1}{(1+e^{-z})^2}e^{-z}= \\frac{1}{1+e^{-z}}(1-\\frac{1}{1+e^{-z}})= g(z)(1-g(z)$\n",
    "\n",
    "Assuming that the n training examples were generated independently, we\n",
    "can then write down the likelihood of the parameters as\n",
    "\n",
    "\n",
    "$p(y=1|x;\\theta)=h_\\theta(x)$\n",
    "\n",
    "\n",
    "$p(y=0|x;\\theta)=1-h_\\theta(x)$\n",
    "\n",
    "\n",
    "\n",
    "$p(y|x;\\theta)=h_\\theta(x)^y(1-h_\\theta(x))^{(1-y)}$\n",
    "\n",
    "\n",
    "$p(\\vec y|X;\\theta )=\\prod p(y|x;\\theta)=\\prod h_\\theta(x)^y(1-h_\\theta(x))^{(1-y)}$\n",
    "\n",
    "As before, it will be easier to maximize the log likelihood:\n",
    "\n",
    "$l(\\theta)=logL(\\theta)=\\sum_{i=1}^{m}y^{(i)}logh_\\theta(x^{(i)})+(1-y^{(i)})log(1-h_\\theta(x^{(i)}))$\n",
    "\n",
    "$\\theta=\\theta+\\alpha\\bigtriangledown _\\theta l(\\theta)$\n",
    "\n",
    "$\\frac{\\partial }{\\partial \\theta_j}l(\\theta)=\\sum_{i=1}^{m}(y^{(i)}-h_\\theta(x^{(i)}))x_j^{(i)}$\n",
    "\n",
    "$\\frac{\\partial }{\\partial \\theta_j}l(\\theta)= (y \\frac {1} {g( \\theta ^T x)} -(1-y) \\frac {1}{1-g(\\theta ^Tx)})\\frac {\\partial} {\\partial \\theta_j}g(\\theta ^T x)$\n",
    "\n",
    "$= (y \\frac {1} {g( \\theta ^T x)} -(1-y) \\frac {1}{1-g(\\theta ^Tx)})g(\\theta ^T x)(1-g(\\theta ^Tx))\\frac {\\partial}{\\partial \\theta_j} \\theta ^Tx$\n",
    "\n",
    "$= (y(1-g(\\theta ^Tx))-(1-y)g(\\theta ^T x))x_j$\n",
    "\n",
    "$= (y-h_\\theta(x))x_j$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fb6e384e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-08-26T08:17:40.845454Z",
     "iopub.status.busy": "2022-08-26T08:17:40.844177Z",
     "iopub.status.idle": "2022-08-26T08:17:42.492549Z",
     "shell.execute_reply": "2022-08-26T08:17:42.491041Z"
    },
    "papermill": {
     "duration": 1.655998,
     "end_time": "2022-08-26T08:17:42.495498",
     "exception": false,
     "start_time": "2022-08-26T08:17:40.839500",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOWFJREFUeJzt3XuQVOWd//HP9EwYRhgQwggIIw4QF4mJuIKkdH8JbkyUn0mF3Y1JrZcCY1ErO7qaoUpFLVgtw8QLBNdNgbmIVhJ+WrmoMVmtH+WWl80vuxIviRDRTLzhIDqIMiMZB5ju3x89p6cv5/Q5p8/99PtVlRqmu6fP0z0Tn08/z/d5noZcLpcTAABABDJRNwAAANQvgggAAIgMQQQAAESGIAIAACJDEAEAAJEhiAAAgMgQRAAAQGQIIgAAIDJNUTegmmw2q71796q1tVUNDQ1RNwcAADiQy+U0MDCg448/XplM9TGPWAeRvXv3qr29PepmAACAGuzZs0czZ86s+phYB5HW1lZJ+RcyYcKEiFsDAACc6O/vV3t7e6EfrybWQcSYjpkwYQJBBACAhHFSVkGxKgAAiAxBBAAARIYgAgAAIkMQAQAAkSGIAACAyBBEAABAZAgiAAAgMgQRAAAQGYIIAACIDEEEAABEJtZbvAMAELXui+/Umy/1Vtx+wskztObHV0XQonQhiAAAUMWbL/Wq5/nXom5GajE1AwAAIkMQAQAAkSGIAACAyBBEAABAZAgiAAAgMqyaAQCgihNOnuHqdrhDEAEAoAr2CgkWUzMAACAyBBEAABAZgggAAIgMQQQAAESGIAIAACJDEAEAAJEhiAAAgMgQRAAAQGQIIgAAIDIEEQAAEBmCCAAAiAxBBAAARIYgAgAAIkMQAQAAkSGIAACAyBBEAABAZAgiAAAgMgQRAAAQGYIIAACIDEEEAABEhiACAAAiQxABAACRIYgAAIDIEEQAAEBkCCIAACAyBBEAABAZgggAAIgMQQQAAESGIAIAACJDEAEAAJEhiAAAgMgQRAAAQGQIIgAAIDIEEQAAEBmCCAAAiAxBBAAARIYgAgAAIkMQAQAAkWmKugEAgOB0X3yn3nypt+L2E06eoTU/viqCFgGlCCIAkGJvvtSrnudfi7oZnhCm0o0gAgAIjVWokKyDRRrCFKwRRAAgxdrnzSj8e3BgUL09+yJsDaEClQINIr29vbr22mv16KOP6i9/+Yvmzp2rrVu3auHChUFeFgAw4vqflI4wrDjpysjDSJiY1om/wILI+++/r7POOktnn322Hn30UbW1telPf/qTJk2aFNQlASAVvHSedj/b0triWzuTgBGY+AssiNx6661qb2/X1q1bC7d1dHQEdTkASA0vnafdzxpTNSecPMPyMUCYAgsiv/zlL3Xuuefqggsu0JNPPqkZM2bon//5n7Vy5cqgLgkAsFE+VZMEVqGJMJUOgQWRV199VZs3b1ZXV5euv/567dixQ//yL/+iMWPGaPny5aY/MzQ0pKGhocL3/f39QTUPAFDkZ995RF/95pcDv0618GB1H7Uc6RZYEMlms1q4cKHWr18vSTrttNO0c+dObdmyxTKIdHd366abbgqqSQAACwf3D0gKvriTUIFygQWR6dOna/78+SW3nXzyyfr5z39u+TNr1qxRV1dX4fv+/n61t7cH1UQAQJkkFXc6CU1M68RfYEHkrLPO0ssvv1xy2yuvvKJZs2ZZ/kxzc7Oam5uDahIAJIKXznPR0gWFgtSPDg2pb89+xz+bNE5CEyMw8RdYEPnmN7+pM888U+vXr9fXvvY1PfPMM/re976n733ve0FdEgBSwUvn+Y1bLvSxJfFWvFlbsbb2KSG3BF4EFkQWLVqkBx98UGvWrNHNN9+sjo4Obdq0SRdddFFQlwSAupOEDbuCamMSVwChUqA7q37pS1/Sl770pSAvAQB1za+ajinHB7fZpN91J7WcV4P44qwZAIC+0rk06iY4lqSCWtgjiAAAClhlgrARRAAABUxrIGyZqBsAAADqFyMiAJBgpy75pOky1mkdbRG0xlzapnuSsFIpSQgiAJBgl28wPzIjTtLWOVMs6y+CCADUIE6fiuttOWstB+chvggiAFADPz4V+xVm6uETevfFd2rwwyHd/NA1qQtW9Y4gAgARcRIgqo12LFq6oG62dDfeqxUnXamW1pbC7e3zZhR2WH34u4/qK51LtWX1ffr9E7tMnyeNI0RJRxABgBirFlaszlpJs96efZb37fp/r+grnUv1+yd2pX6EKE0IIgBQB+65cZt2PPpCxe2MECBqBBEAqAP7XutjlMAnaVuOHDWCCADUIE6dEatIwsUIkr8IIgBQAz86I69h5qNDQ47bYjw2aH4va77nxm36xi0Xxir4eRGnZd9x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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# original method, use numpy to implement\n",
    "%matplotlib inline\n",
    "from sklearn.datasets import make_blobs\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from math import exp, log\n",
    "import copy\n",
    "\n",
    "## Hyper-paramters definition，超参数定义，算法中如学习率，迭代的轮数均为超参数\n",
    "LR = 0.05\n",
    "EPOCH = 5\n",
    "'''\n",
    "numpy.random.normal(loc=0.0, scale=1.0, size=None)  \n",
    "loc:float 概率分布的均值，对应着整个分布的中心center\n",
    "scale:float概率分布的标准差，对应于分布的宽度，scale越大越矮胖，scale越小，越瘦高\n",
    "size:int or tuple of ints\n",
    "我们更经常会用到np.random.randn(size)所谓标准正太分布（μ=0, σ=1），对应于np.random.normal(loc=0, scale=1, size)\n",
    "'''\n",
    "THETA = np.random.normal(0, 0.1, 3).reshape(3, 1) # learnable parameters\n",
    "# https://www.jianshu.com/p/069d8841bd8e make_blobs函数是为聚类产生数据集\n",
    "# 2个中心点，2个维度的属性，600个样本点的簇数据，可以用于二分类任务建模\n",
    "X, Y = make_blobs(n_samples=600, centers=2, n_features=2, random_state=3)\n",
    "\n",
    "# train_test_split对数据进行随机shuffle后按照0.7，0.3的比例进行切分。\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)\n",
    "\n",
    "'''\n",
    "散点图 设置散点的形状为 方块（square），默认是圆点（'o'），每个散点的边缘颜色设置为白色\n",
    "c=Y_train 的自动上色规则，如果 Y_train 是 分类标签（如 0, 1, 2），会用默认颜色映射（如 viridis, tab10）上不同颜色。如果是 连续数值，则表现为渐变色。\n",
    "连续（Sequential）无限渐变高精度\t离散（Categorical）最多10种颜色\n",
    "import matplotlib.pyplot as plt\n",
    "print(plt.colormaps()) \n",
    "'''\n",
    "plt.scatter(X_train[:,0], X_train[:, 1], c=Y_train, edgecolors='white', marker='s')\n",
    "plt.show()\n",
    "\n",
    "X0_train = np.ones([X_train.shape[0],1],dtype=X_train.dtype)\n",
    "X0_test = np.ones([X_test.shape[0],1], dtype=X_test.dtype)\n",
    "X_train_original = copy.deepcopy(X_train)\n",
    "X_train = np.concatenate((X0_train,X_train), axis=1)\n",
    "X_test = np.concatenate((X0_test, X_test), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "15201888",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-08-26T08:17:42.504815Z",
     "iopub.status.busy": "2022-08-26T08:17:42.504350Z",
     "iopub.status.idle": "2022-08-26T08:17:42.768377Z",
     "shell.execute_reply": "2022-08-26T08:17:42.766307Z"
    },
    "papermill": {
     "duration": 0.272425,
     "end_time": "2022-08-26T08:17:42.771556",
     "exception": false,
     "start_time": "2022-08-26T08:17:42.499131",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "THETA [[ 0.06173407]\n",
      " [-1.78990076]\n",
      " [-1.30694157]]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xulis\\AppData\\Local\\Temp\\ipykernel_28280\\1400742222.py:31: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
      "  g = 1/(1 + exp(-h_x))\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "import matplotlib.animation as animation\n",
    "from matplotlib.animation import FuncAnimation\n",
    "import copy\n",
    "thetas = []\n",
    "#ln = None\n",
    "\n",
    "p_x = np.linspace(X.min()-1, X.max()+1, 50)\n",
    "#fig = plt.figure()\n",
    "#plt.scatter(X_test[:,1], X_test[:,2], c=Y_test, marker='o', edgecolors='white')\n",
    "#ln, = plt.plot(p_x, THETA[1,0]*p_x+THETA[0,0], c='orange')\n",
    "#ln = plt.scatter(X_test[:,1], X_test[:,2], c=Y_test, marker='o', edgecolors='white')\n",
    "fig, ax = plt.subplots()\n",
    "scat = ax.scatter(X_test[:,1], X_test[:,2], c=Y_test, cmap='viridis')  # 使用c参数，cmap指定颜色映射\n",
    "\n",
    "def init():\n",
    "    # plt.ylim((Y.min()-10, Y.max()+10))\n",
    "    # plt.xlim((X.min()-1, X.max()+1))\n",
    "    ax.set_xlim(X.min()-1, X.max()+1)\n",
    "    ax.set_ylim(Y.min()-10, Y.max()+10)    \n",
    "    return scat,\n",
    "\n",
    "# 线性函数实现，x矩阵的一行为一个样本\n",
    "def linear_h(theta, x):\n",
    "    #print(x)\n",
    "    h_x = np.matmul(theta.T,x.T)\n",
    "    return h_x\n",
    "\n",
    "# sigmoid函数，基于numpy，支持向量的计算，参数为全局变量\n",
    "def sigmoid(x):\n",
    "    h_x = linear_h(THETA,x)\n",
    "    g = 1/(1 + exp(-h_x))\n",
    "    return g\n",
    "\n",
    "# 支持传入参数变量版本的sigmoid函数实现\n",
    "def sigmoid_with_params(x, theta):\n",
    "    h_x = linear_h(theta,x)\n",
    "    g = 1/(1 + exp(-h_x))\n",
    "    return g    \n",
    "\n",
    "# 损失函数，同样支持向量的运算，损失函数的定义基于单个样本似然函数的负对数\n",
    "def loss_function(sample):\n",
    "    x,y = sample[0], sample[1]\n",
    "    p = sigmoid(x)\n",
    "    loss = -y*log(p)-(1-y)*log(1-p)\n",
    "    return loss\n",
    "\n",
    "#梯度定义，根据sigmoid函数的导数性质g'(z)=g(z)(1-g(z))，并根据损失函数的定义进行求解得出梯度\n",
    "def gradient(sample):\n",
    "    x,y = sample[0], sample[1]\n",
    "    h = sigmoid(x)\n",
    "    return (h-y)*x\n",
    "\n",
    "#梯度下降算法\n",
    "def update_parameters(theta, gradient, lr):\n",
    "    theta = theta-lr*gradient\n",
    "    return theta\n",
    "\n",
    "def update(frame):\n",
    "    #xdata.append(frame)\n",
    "    #ydata.append(np.shin(frame))\n",
    "    #Y = frame[1,0]*X_test[:,1]+frame[2,0]*X_test[:,2]+frame[0,0]\n",
    "    Y = np.zeros((X_test.shape[0],))\n",
    "    for idx, x in enumerate(X_test):\n",
    "        Y[idx] = np.around(sigmoid_with_params(x, frame))\n",
    "    #print(X_test.shape, Y.shape)\n",
    "    #scat.set_offsets(np.c_[new_x, new_y])\n",
    "    #scat.set_data(X_test[:,1], X_test[:,2], Y)\n",
    "    scat.set_offsets(np.c_[X_test[:,1], X_test[:,2]])\n",
    "    scat.set_array(Y)  # 更新c参数\n",
    "    return scat,\n",
    "\n",
    "for ep in range(EPOCH):\n",
    "    for index in range(X_train.shape[0]//2):\n",
    "        batch_X = X_train[index*2:(index+1)*2,:] # 2*2 matrix\n",
    "        batch_Y = Y_train[index*2:(index+1)*2]# 2*1 matrix\n",
    "        #print(batch_X)\n",
    "        h_X = [sigmoid(x) for x in batch_X]\n",
    "        loss = [ loss_function((x,y)) for (x,y) in zip(batch_X, batch_Y)]\n",
    "        g = [gradient((x,y)) for (x,y) in zip(batch_X, batch_Y)]\n",
    "        g = np.array(g).mean(axis=0)\n",
    "        g = g.reshape([3,1])\n",
    "        THETA = update_parameters(THETA, g, LR)\n",
    "        theta = copy.deepcopy(THETA)\n",
    "        thetas.append(theta)\n",
    "\n",
    "i = 0\n",
    "print('THETA', THETA)\n",
    "\n",
    "# # 创建动画\n",
    "# anim = animation.FuncAnimation(fig, update,frames=thetas,interval=25,init_func=init, blit=False)\n",
    "# # plt.show()\n",
    "# anim.save(\"./sgd_logistic_regression.gif\",writer='pillow')\n",
    "H_test = np.zeros([Y_test.shape[0], 1], dtype=Y_test.dtype)\n",
    "# 利用所得迭代求解参数结果在测试集合上的表现，用了sigmoid结果四舍五入的计算\n",
    "for x, y in zip(X_test, Y_test):\n",
    "    H_test[i,0] = np.around(sigmoid(x))\n",
    "    i+=1\n",
    "plt.figure(1)\n",
    "x = np.linspace(-7, 4, 50)\n",
    "plt.scatter(X_test[:, 1], X_test[:, 2], c=H_test[:, 0], edgecolors='white', marker='s')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9afb8966",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2022-08-26T08:17:42.783530Z",
     "iopub.status.busy": "2022-08-26T08:17:42.781886Z",
     "iopub.status.idle": "2022-08-26T08:17:44.981259Z",
     "shell.execute_reply": "2022-08-26T08:17:44.979863Z"
    },
    "papermill": {
     "duration": 2.208485,
     "end_time": "2022-08-26T08:17:44.984135",
     "exception": false,
     "start_time": "2022-08-26T08:17:42.775650",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xulis\\AppData\\Local\\Temp\\ipykernel_28280\\1400742222.py:31: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
      "  g = 1/(1 + exp(-h_x))\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "ename": "",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31mThe Kernel crashed while executing code in the current cell or a previous cell. \n",
      "\u001b[1;31mPlease review the code in the cell(s) to identify a possible cause of the failure. \n",
      "\u001b[1;31mClick <a href='https://aka.ms/vscodeJupyterKernelCrash'>here</a> for more info. \n",
      "\u001b[1;31mView Jupyter <a href='command:jupyter.viewOutput'>log</a> for further details."
     ]
    }
   ],
   "source": [
    "# pytorch版本实现\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "class LogisticRegression(nn.Module):\n",
    "    def __init__(self, input_size, output_size):\n",
    "        super(LogisticRegression,self).__init__()\n",
    "        self.linear = nn.Linear(input_size, output_size)\n",
    "        self.sigmoid = nn.Sigmoid()\n",
    "        \n",
    "    def forward(self, x):\n",
    "        out = self.linear(x)\n",
    "        out = self.sigmoid(out)\n",
    "        return out\n",
    "\n",
    "model = LogisticRegression(2,1)\n",
    "model = model.double()\n",
    "# BCELoss与CrossEntropyLoss都是用于分类问题。可以知道，BCELoss是\n",
    "# Binary CrossEntropyLoss的缩写，BCELoss是CrossEntropyLoss的一个特例，\n",
    "# 只用于二分类问题，而CrossEntropyLoss可以用于二分类，也可以用于多分类。\n",
    "criterion = nn.BCELoss()\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.02)\n",
    "num_epoches = 3\n",
    "for epoch in range(num_epoches):\n",
    "    for index in range(X_train_original.shape[0]//2):\n",
    "        batch_X = X_train_original[index*2:(index+1)*2,:]\n",
    "        batch_Y = Y_train[index*2:(index+1)*2].reshape([2,1])\n",
    "        inputs = torch.from_numpy(batch_X)\n",
    "        targets = torch.from_numpy(batch_Y).double()\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(inputs)\n",
    "        loss = criterion(outputs,targets)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "    if (epoch+1) % 5 == 0:\n",
    "      print ('Epoch [%d/%d], Loss: %.4f' \n",
    "           %(epoch+1, num_epoches, loss.data[0]))\n",
    "\n",
    "i=0\n",
    "H_test = np.zeros([Y_test.shape[0], 1], dtype=Y_test.dtype)\n",
    "for x, y in zip(X_test, Y_test):\n",
    "    H_test[i,0] = np.around(sigmoid(x))\n",
    "    i+=1\n",
    "plt.figure(1)\n",
    "x = np.linspace(-7, 4, 50)\n",
    "plt.scatter(X_test[:, 1], X_test[:, 2], c=H_test[:, 0], edgecolors='white', marker='s')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "46b26dcf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.datasets import make_blobs\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from math import exp, log\n",
    "import copy\n",
    "\n",
    "# https://www.jianshu.com/p/069d8841bd8e make_blobs函数是为聚类产生数据集\n",
    "X, Y = make_blobs(n_samples=300, centers=2, n_features=2, random_state=3)\n",
    "# plt.scatter(X[:, 0], X[:, 1], c=Y)\n",
    "# plt.show()\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)\n",
    "plt.scatter(X_train[:,0], X_train[:, 1], c=Y_train, edgecolors='white', marker='s')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6df7f6e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Step2:Step 2: Fitting Simple LogisticRegression  Model to the training set\n",
    "# 基于sklearn逻辑回归的算法实现\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "regressor = LogisticRegression()\n",
    "regressor = regressor.fit(X_train, Y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "656cdd5e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x185a11051d0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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xSOPPMKLL76IMSbZ4TVb277vH3/8ceU5v9/PSSedhLWWJ598MolRisTXiBEj+Oabbxg3blyyQ2nWli9fzpVXXsnYsWMTMucx6VvMRzJ8+HAGDBhQ+Xm7du3wer306tWrSruePXsye/bsRIfXbG37vr/xxhusWbOGrl27Vh4LBoNce+21jBkzhqVLlyYhyuZn2/e9U6dOwJ+JxrJly/jwww/VqxFHbdu2xePxsHr16irHV69ezXbbbZekqFqOyy67jMmTJ/PRRx/RuXPnZIfTrC1YsIA1a9aw9957Vx4LBoN89NFHPPbYY5SVleHxeGJ2v0adbOTk5JCTk1PlWL9+/aotifrxxx/p1q1bIkNr1rZ93y+66CKOPvroKm2GDRvGmWeeybnnnpvo8Jqtmn7eKxKNJUuWMGPGDNq0aZOk6FqG1NRU9tlnH6ZPn86xxx4LhLr1p0+fzmWXXZbc4Joxay2XX345EyZMYObMmfTo0SPZITV7Bx98MF9//XWVY+eeey677bYbI0eOjGmiAY082ajJ9ddfz8knn8ygQYM48MADmTp1Ku+88w4zZ85MdmjNVps2bao95FJSUthuu+3YddddkxRV8+f3+znhhBNYuHAhkydPJhgMVs4baN26NampqUmOsHm65pprOPvss9l3333p378/Y8aMoaioSIl1HI0YMYJXX32VSZMmkZOTU/lznpeXR0ZGRpKja55ycnKqzYnJysqiTZs2cZkr0+SSjeOOO46nnnqKUaNGccUVV7Drrrvy1ltvccABByQ7NJGYWrFiBW+//TYAffv2rXJuxowZDBkyJPFBtQAnn3wya9eu5bbbbmPVqlX07duXqVOnVps0KrFTMQ9p25/pF154gXPOOSfxAUnMaYt5ERERiatGvRpFREREmj4lGyIiIhJXSjZEREQkrpRsiIiISFwp2RAREZG4UrIhIiIicaVkQ0REROJKyYaIiIjElZINERERiSslGyIiIhJXSjZEREQkrpRsiIiISFz9PxdctsEQKUwXAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Y_pred = regressor.predict(X_test)\n",
    "#Step 4: Visualization\n",
    "#Visualising the Training results\n",
    "#plt.scatter(X_train , Y_train, color = 'red')\n",
    "# plt.scatter(X_test[:,1] , X_test[:,2] ,np.argmax(Y_pred, axis=1), color ='blue')\n",
    "plt.scatter(X_test[:,0] , X_test[:,1] ,c =Y_pred)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  },
  "papermill": {
   "default_parameters": {},
   "duration": 17.325189,
   "end_time": "2022-08-26T08:17:47.231993",
   "environment_variables": {},
   "exception": null,
   "input_path": "__notebook__.ipynb",
   "output_path": "__notebook__.ipynb",
   "parameters": {},
   "start_time": "2022-08-26T08:17:29.906804",
   "version": "2.3.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
